/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package be.hogent.iii.project.gui;

import be.hogent.iii.project.client.netwerk.Connectie;
import be.hogent.iii.project.common.game.objecten.Spel;
import be.hogent.iii.project.common.game.objecten.Speler;
import be.hogent.iii.project.dummy.DummyVeld;
import be.hogent.iii.project.objects.Entiteit;
import be.hogent.iii.project.objects.Veld;
import java.awt.GraphicsEnvironment;
import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.Properties;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

/**
 * Het frame dat alles panelen bevat. 
 * @author Caribou
 */
public class SpelFrame extends JFrame {
    
    private static SpelFrame spelFrame;
    private static final long serialVersionUID = 1L;
    private static final String PROPERTYFILE = "src\\be\\hogent\\iii\\project\\gui\\vakEigenschappen.properties";
    private Connectie connectie;
    private PaneelEventHandler handler;
    private Speler speler;
    private Spel spel;
    private Veld veld;
    private Properties props;
    private SpelPaneel spelPaneel;
    private long startTijd;
    
    /**
     * Basis constructor. 
     */
    private SpelFrame() {
        super("Project");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        props = this.loadProperties();
        //handler = new PaneelEventHandler(spel.getSpel(), props);
        //SpelPaneel paneel = new SpelPaneel(spel.getSpel(), props, handler);
        //this.setContentPane(paneel);
  
        this.pack();
        setLocationRelativeTo(null);
        //this.setVisible(true);
        
        spelFrame = this;
        //startSpel();
    }
    
    
    public static synchronized SpelFrame getSpelFrame() {
        if (spelFrame == null) {
              spelFrame = new SpelFrame();
        }
        return spelFrame;
    }
    
    //om te checken of er al een frame actief is, nodig voor chatberichthandler
    public static synchronized boolean isActief() {
        if (spelFrame == null) {
              return false;
        }
        else {
            return true;
        }
    }
    
    public void spelAfsluiten(){
        spelFrame = null;
        dispose();
    }
    
    
    /**
     * Lees properties file in. 
     * @return properties
     */
    private Properties loadProperties(){
        Properties property = new Properties();
        try {
            File file = new File(PROPERTYFILE);
            property.load(new FileInputStream(file));
        } //catch exception in case properties file does not exist
        catch (Exception e) {
            e.printStackTrace();
        }
        return property;
    }

    /**
     * De methode om het programma te starten
     * @param args
     */
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                //JFrame.setDefaultLookAndFeelDecorated(true);
                new SpelFrame();
            }
        });
    }

    public Connectie getConnectie() {
        return connectie;
    }

    public void setConnectie(Connectie connectie) {
        this.connectie = connectie;
    }
    
    public void volgendeBeurt(String nickAanBeurt, ArrayList<Entiteit> entiteiten){
        boolean aanBeurt;
        if (nickAanBeurt.equals(speler.getNick())){
            aanBeurt = true;
            System.out.println("Dit frame is aan zet");
        }
        else {
            aanBeurt = false;
            System.out.println("niet aan zet");
        }
        spelPaneel.getBottomPaneel().geefBeurtWeer(aanBeurt);
        veld.beginBeurt(aanBeurt, getSpelerIndex(nickAanBeurt), entiteiten);
        handler.beginBeurt(aanBeurt);
    }

    public Speler getSpeler() {
        return speler;
    }

    public void setSpeler(Speler speler) {
        this.speler = speler;
        this.setTitle(speler.getNick());
    }

    public Spel getSpel() {
        return spel;
    }

    public void setSpel(Spel spel) {
        this.spel = spel;
        DummyVeld dummyVeld = new DummyVeld();
        veld = dummyVeld.getVeld2(spel.getDeelnemers().size());
        //veld = dummyVeld.getVeld();
    }
    
    public void startSpel() {
        startTijd = System.currentTimeMillis();
        spel.setHuidigeSpelerID(getSpelerIndex());
        handler = new PaneelEventHandler(spel, veld, props, getSpelerIndex());
        spelPaneel = new SpelPaneel(spel, veld, props, handler, connectie);
        this.setContentPane(spelPaneel);
    }
    
    public void eindeBeurt(){
        veld.eindeBeurt();
    }
    
    public SpelPaneel getSpelPaneel() {
        return spelPaneel;
    }
    
    private int getSpelerIndex(){
        return getSpelerIndex(speler.getNick());
    }
    
    private int getSpelerIndex(String nickname){
        int spelerIndex =0;
        for(int i=0;i<spel.getDeelnemers().size();i++){
            if (((be.hogent.iii.project.common.game.objecten.Speler)spel.getDeelnemers().get(i)).getNick().equalsIgnoreCase(nickname)){
                spelerIndex = i;
            }
        }
        return spelerIndex;
    }
    
    public long getStartTijd(){
        return startTijd;
    }
}
